perfect square dynamic programming